/*
 * Created by JFormDesigner on Sun Oct 19 20:20:14 CST 2025
 */

package com.geek.javase.ch10.jformdesigntest.japanel;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * JPanel之间的跳转：
 * 例如，当前为RegisterPanel，想要跳转到loginPanel。
 * 鼠标放在注册button，右键点击注册button按钮，选择Add Event Handler,选择ActionListener-actionPerformed
 * 就会生成private void registerButtonActionPerformed(ActionEvent e) {}方法
 * 在里面写逻辑代码，例如，跳转界面
 *                 获取当前父级容器的布局管理器———>CardLayout
 *                 CardLayout cardLayout = (CardLayout)this.getParent().getLayout();
 *                 cardLayout.show(this.getParent(),"login");
 * 需要找到父级容器，然后获取父级容器的布局管理器layoutManger（接口），然后调用show方法，参数为当前界面名称
 */

/**
 * 数据交互：
 * 例如，在注册界面，收集表单数据。密码收集得到的是char。由于性别按钮，单选，所以需要判断单选按钮是否被选中（要实现按钮互斥）
 * 封装User对象，注册
 * 登录成功，则回显渲染，进行其他可做的操作
 * 刚刚注册成功的时候，有user对象，所以，在登录成功之后，回显数据，虽然无法直接传给注册界面，但可以通过父窗口，MyFrame中的共同数据user赋值
 * 能够将数据带到每个页面，相当于在MyFrame中提供了一个数据载体，只要在注册JPanel添加了数据，就传入MyFrame my, this.my.user = user;
 * 这样就确保下面都可以用，相当于将每个my带到了每个panel。其他loginPanel，mainPanel也同理。
 * 因为在MyFrame中，添加JPanel组件时，
 *         registerPanel = new RegisterPanel(this);  //this就是MyFrame
 *         loginPanel = new LoginPanel(this);
 *         mainPanel = new MainPanel(this);
 *那只要在构建对象的时候，将my(this)，给每个panel传入，就可以在panel中获取到数据了，现在每个panel都可以拿到my
 * 而my可以调用user,即my.user(共同数据)这个user,就是刚才注册的user
 * 注意：单例（bank就使用了单例）
 * 因为，当每次注册后，进行登录时，会进行查询，在UserService中，查询时，会在UserDao会new一个新的ArrayList，而刚才注册时new了一个
 * 现在登录查询，又new了一个，比对不上！
 * （银行Bank使用的单例，只会new一次！）
 * 而这里没有使用单例，就需要在UserDao中，将userList改为static。即：
 *     //加个static，是因为每次new，都会创建新的user,例如，银行为了保持是同一个对象，使用了单例
 *     private static List<User> list = new ArrayList<>();
 */

/**
 * 清空当前页面数据
 * 可以在每个panel文件中，封装一个clearXXX（）方法，当有跳转的地方，都可以设置清空当前页面数据
 */
public class RegisterPanel extends JPanel {
    
    private UserService userService = new UserService();
    private MyFrame my;

    public RegisterPanel(MyFrame my) {
        this.my = my;

        initComponents();
        //按钮组  使其互斥,只能二选一
        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);
    }
    //点击注册按钮的事件
    private void registerButtonActionPerformed(ActionEvent e) {
        // TODO add your code here
        //收集表单数据
        String username = nameTextField.getText();
        //passwordField.getPassword()这个收集到的是char，需要转成String
        String password = new String(passwordField.getPassword());
        String gender = "";
        //判断单选按钮是否被选中
        if(radioButton1.isSelected()){
            gender = radioButton1.getText();
        }else if(radioButton2.isSelected()){
            gender = radioButton2.getText();
        }
        /*System.out.println(username);
        System.out.println(password);
        System.out.println(gender);*/
        //封装User对象，注册
        if(username != null && password != null && gender != null &&
                !username.equals("")  && !password.equals("")&& !gender.equals("")){
            //这里是封装的uer,
            User user = new User(username, password, gender);
            boolean flag = userService.register(user);
            if(flag){
                //只有当flag为true，注册成功
                //渲染登录界面数据，回显用户的姓名 User
                my.user=user;
                my.loginPanel.initLogin();
                //跳转界面
                //获取当前父级容器的布局管理器———>CardLayout
                CardLayout cardLayout = (CardLayout)this.getParent().getLayout();
                cardLayout.show(this.getParent(),"login");
                //清空当前页面数据
                clearRegister();

            }else{
                //如果返回false，就清空密码
                passwordField.setText("");
            }
        }
    }

    /*//初始写法：没有封装clearRegister()时
    //点击重置按钮的事件
    private void resetButtonActionPerformed(ActionEvent e) {
        // TODO add your code here
        nameTextField.setText("");
        passwordField.setText("");
        radioButton1.setSelected(false);
        radioButton2.setSelected(false);
    }*/
    //当封装了clearRegister()方法后，
    //点击重置按钮的事件
    private void resetButtonActionPerformed(ActionEvent e) {
        // TODO add your code here
        clearRegister();
    }
    //清空注册界面
    public void clearRegister(){
        nameTextField.setText("");
        passwordField.setText("");
        radioButton1.setSelected(false);
        radioButton2.setSelected(false);
    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents  @formatter:off
        titleLabel = new JLabel();
        nameLabel = new JLabel();
        nameTextField = new JTextField();
        pwdLabel = new JLabel();
        sexLabel = new JLabel();
        radioButton1 = new JRadioButton();
        radioButton2 = new JRadioButton();
        registerButton = new JButton();
        resetButton = new JButton();
        passwordField = new JPasswordField();

        //======== this ========
        setLayout(null);

        //---- titleLabel ----
        titleLabel.setText("\u6ce8 \u518c \u754c \u9762");
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        titleLabel.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 18));
        add(titleLabel);
        titleLabel.setBounds(115, 10, 140, 67);

        //---- nameLabel ----
        nameLabel.setText("\u59d3 \u540d");
        nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
        nameLabel.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 14));
        add(nameLabel);
        nameLabel.setBounds(50, 100, 32, 19);
        add(nameTextField);
        nameTextField.setBounds(105, 95, 180, 30);

        //---- pwdLabel ----
        pwdLabel.setText("\u5bc6 \u7801");
        pwdLabel.setHorizontalAlignment(SwingConstants.CENTER);
        pwdLabel.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 14));
        add(pwdLabel);
        pwdLabel.setBounds(50, 155, 32, 19);

        //---- sexLabel ----
        sexLabel.setText("\u6027 \u522b");
        sexLabel.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 14));
        sexLabel.setHorizontalAlignment(SwingConstants.CENTER);
        add(sexLabel);
        sexLabel.setBounds(50, 200, 32, 19);

        //---- radioButton1 ----
        radioButton1.setText("\u7537");
        add(radioButton1);
        radioButton1.setBounds(130, 200, 50, 21);

        //---- radioButton2 ----
        radioButton2.setText("\u5973");
        add(radioButton2);
        radioButton2.setBounds(220, 200, 50, 21);

        //---- registerButton ----
        registerButton.setText("\u6ce8\u518c");
        registerButton.addActionListener(e -> registerButtonActionPerformed(e));
        add(registerButton);
        registerButton.setBounds(90, 245, 78, 30);

        //---- resetButton ----
        resetButton.setText("\u91cd\u7f6e");
        resetButton.addActionListener(e -> resetButtonActionPerformed(e));
        add(resetButton);
        resetButton.setBounds(230, 245, 78, 30);
        add(passwordField);
        passwordField.setBounds(105, 155, 180, 30);

        setPreferredSize(new Dimension(400, 300));
        // JFormDesigner - End of component initialization  //GEN-END:initComponents  @formatter:on
    }

    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables  @formatter:off
    private JLabel titleLabel;
    private JLabel nameLabel;
    private JTextField nameTextField;
    private JLabel pwdLabel;
    private JLabel sexLabel;
    private JRadioButton radioButton1;
    private JRadioButton radioButton2;
    private JButton registerButton;
    private JButton resetButton;
    private JPasswordField passwordField;
    // JFormDesigner - End of variables declaration  //GEN-END:variables  @formatter:on
}
